import logging
import random

from django.shortcuts import render
from django.views import View
from django.http import HttpResponse, JsonResponse
from django_redis import get_redis_connection

from utils.captcha.captcha import captcha
from utils.json_res import json_response
from utils.res_code import Code, error_map
from . import contants
from .forms import CheckImageForm
from user.models import User


logger = logging.getLogger('django')


def image_code_view(request):
    """
    生成验证码
    url:/image_code/
    :param request:
    :return:
    """
    # 1. 生成验证码，随机生成字符串，生成图片
    text, image = captcha.generate_captcha()

    # 2. 后端保存，为了校验
    # 保存session
    request.session['image_code'] = text
    # 过期时间
    request.session.set_expiry(300)

    # 3. 记录一个日志
    logger.info('Image code:{}'.format(text))

    # 4. 返回验证码
    return HttpResponse(content=image, content_type='image/jpg')


def check_username_view(request, username):
    """
    校验用户名
    :param request:
    :param username:
    :return:
    """
    data = {
        "username": username,  # 查询的用户名
        "count": User.objects.filter(username=username).count()  # 用户名查询的数量
        }
    return json_response(data=data)


def check_mobile_view(request, mobile):
    """
    校验用户名
    :param request:
    :param username:
    :return:
    """
    data = {

        "mobile": mobile,  # 查询的手机号码
        "count": User.objects.filter(mobile=mobile).count()  # 用户名查询的数量

    }
    return json_response(data=data)


class SmsCodeView(View):
    """

    """
    def post(self, request):
        """
        :param request:
        :return:
        """
        form = CheckImageForm(request=request)
        # 校验手机号码,图形验证码
        if form.is_valid():
            # 获取手机号码
            mobile = form.cleaned_data.get('mobile')
            # 生成短信验证码
            sms_code = ''.join([random.randint() for _ in range(contants.SMS_CODE_LENGTH)])
            # 发送短信验证码，调用接口
            logger.info('发送短信验证码[mobile: {}, sms_code: {}]'.format(mobile, sms_code))
            print('发送短信验证码[mobile: {}, sms_code: {}]'.format(mobile, sms_code))
            # 保存验证码 session(需要设置时限，但是session中的时限是统一的，在这里设置的时限会将上面的冲掉),mysql（效率太低）,redis
            sms_flag_key = 'sms_flag_{}'.format(mobile)  # 创建短信验证码发送记录的key
            sms_text_key = 'sms_text_{}'.format(mobile)  # 创建短信验证码内容的key
            redis_conn = get_redis_connection(alias="verify_code")  # alias，在设置中的别名
            pl = redis_conn.pipeline()  # 创建管道
            try:
                pl.setex(sms_flag_key, 60, 1)
                pl.setex(sms_text_key, 5 * 60, sms_code)
                # 让管道通知redis执行命令
                pl.execute()
                return json_response(errmsg="短信验证码发送成功")
            except Exception as e:
                logger.error('异常：{}'.format(e))
                return json_response(errno=Code.UNKOWNERR, errmsg=error_map[Code.UNKOWNERR])
        else:
            # 对表单的报错信息进行拼接
            err_msg_list = []
            for item in form.errors.values():
                err_msg_list.append(item[0])

            err_msg_str = '/'.join(err_msg_list)
            print(err_msg_str)
            return json_response(errno=Code.PARAMERR, errmsg=err_msg_str)
